<?php

/**
 * factura actions.
 *
 * @package    Acatec
 * @subpackage factura
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class facturaActions extends sfActions
{
  public function executeIndex(sfWebRequest $request)
  {
  	$this->getUser()->setAttribute('current','factura');
  	
  	 // Creamos una vble de usuario que contendrá el id de la empresa
        // Tomamos el nombre de usuario, para obtener a través de la consulta cruzada el id de la empresa
        $user = $this->getContext()->getUser()->getGuardUser();
        $username = $user->getUsername();
    
        //Creamos la consulta para obtener el idempresa a partir del nombre de usuario
        $q = Doctrine_Query::create()
            ->select('empresa_id')
            ->from('CrmContacto c')
            ->where('c.id IN (SELECT u.contacto_id FROM CrmUserContacto u WHERE u.user_id IN 
                             (SELECT s.id FROM SfGuardUser s WHERE s.username= ?))',$username);

        $empresa_id = $q->fetchOne(array(), Doctrine_Core::HYDRATE_ARRAY);
    
        // Y el resultado lo guardamos en la vble de sesión.
        $this->getUser()->setAttribute('empresa_id', $empresa_id['empresa_id']);

  	// Definimos la cultura del usuario por defecto
  		//$this->getUser()->setCulture(sfConfig::get('app_culture_default','es'));
  	$this->getUser()->setCulture('es');
  	
  	
  	//$this->crm_presupuestos = Doctrine_Core::getTable('CrmFactura')
    //  ->createQuery('a')
    //  ->execute();
  	
  	if ($request->getParameter('sort') && $this->isValidSortColumn($request->getParameter('sort')))
  	{
  		$this->setSort(array($request->getParameter('sort'), $request->getParameter('sort_type')));
  	}
  	 
  	// pager
  	if ($request->getParameter('page'))
  	{
  		$this->setPage($request->getParameter('page'));
  	}
  	$this->pager = $this->getPager();
  	$this->sort = $this->getSort();
    
  }

  public function executeFilter(sfWebRequest $request)
  {
  	$this->setPage(1);
  
  	if ($request->hasParameter('_reset'))
  	{
  		$this->setFilters(array());
  
  		$this->redirect('@crm_factura');
  	}
  
  	$this->filters = new CrmFacturaFormFilter($this->getFilters());
  
  	$this->filters->bind($request->getParameter($this->filters->getName()));
  	if ($this->filters->isValid())
  	{
  		$this->setFilters($this->filters->getValues());
  
  		$this->redirect('@crm_factura');
  	}
  
  	$this->pager = $this->getPager();
  	$this->sort = $this->getSort();
  
  	$this->setTemplate('index');
  }
  
  public function executeShow(sfWebRequest $request)
  {
      $this->factura = Doctrine_Core::getTable('CrmFactura')->find(array($request->getParameter('id')));
      $this->cliente = Doctrine_Core::getTable('CrmContacto')->find($this->factura->getClienteId());
      $this->vehiculo = $this->factura->getCrmVehiculo();
      $this->conceptos = $this->factura->getCrmFacturaConcepto();
  }

  public function executeNew(sfWebRequest $request)
  {
    /** NOTA DE MEJORA
    *****************************************************************************************
    En el modulo de inicio se inicializan las vbles de sesión.
    Debería controlarse de algún modo que estas vbles hayan sido creadas al llegar a este punto
    puesto que puede que el usuario no haya pasado por el punto inicial. **/
    //Establezco esta vble de sesión que indica que vengo de una nueva factura para volver aquí
        $this->getUser()->setAttribute('nueva_fra',1);  
        //Borro las vbles de sesion de los otros documentos
        $this->getUser()->getAttributeHolder()->remove('nuevo_parte');
        $this->getUser()->getAttributeHolder()->remove('nuevo_pto');
        
        // Cargamos el valor de la nueva factura (el número por el que debe comenzar si es la primera)
        if ($this->esPrimeraFactura()) {    
            $this->redirect('configuracion/primeraFactura');            
        }    
        else {
            $empresa_id = $this->getUser()->getAttribute('empresa_id');
            $this->form = new CrmFacturaForm();
            
  	    //Cogemos de la BD el numero que le corresponde
            $campo = "numFactura";
            $q = Doctrine_Query::create()
            ->select('valor')
            ->from('CrmConfiguracion c1')
            ->where('c1.campo = ?',$campo);
            $this->numero = $q->fetchOne(array(), Doctrine_Core::HYDRATE_SINGLE_SCALAR);
            
            $campo = "tipoIVA";
            $q = Doctrine_Query::create()
            ->select('valor')
            ->from('CrmConfiguracion c2')
            ->where('c2.campo = ?',$campo);
            $tipo_iva = $q->fetchOne(array(), Doctrine_Core::HYDRATE_SINGLE_SCALAR);
    
            // Cargamos el valor de la nueva factura
            $this->form->getObject()->setEmpresaId($empresa_id);
            $this->form->setDefault('numero', $this->numero);
            $this->form->setDefault('descuento', 0);
            $today = date("Y-m-d");
            $this->form->setDefault('fecha', $today);
            $this->form->setDefault('tipo', $tipo_iva);
        }
  }

  public function executeCreate(sfWebRequest $request)
  {
    $this->forward404Unless($request->isMethod(sfRequest::POST));
    $this->form = new CrmFacturaForm();
    $this->processForm($request, $this->form);
    $this->setTemplate('new');
  }

  /* Las facturas no se pueden editar
  public function executeEdit(sfWebRequest $request)
  {
    $this->getUser()->setAttribute('accion','editar');
    $this->forward404Unless($this->factura = Doctrine_Core::getTable('CrmFactura')->find(array($request->getParameter('id'))), sprintf('Object crm_factura does not exist (%s).', $request->getParameter('id')));
    if (null == $this->factura->getDescuento()){
        $this->factura->setDescuento(0);
    }
    $this->cliente = $this->factura->getCrmContacto();
    $this->vehiculo = $this->factura->getCrmVehiculo();
    $this->factura->calcular();
    $this->form = new CrmFacturaForm($this->factura);
  }
  */
  
  public function executeEdit(sfWebRequest $request)
  {
  	$this->getUser()->setAttribute('accion','editar');
        $this->getUser()->setAttribute('nuevo_fra',0);
        if ($this->getUser()->getAttribute('borrarBD')) {
            $this->borrarBD = $this->getUser()->getAttribute('borrarBD');
        }
        else{ // Para que funcione el Javascript, aunque en este caso da igual puesto que no se va a editar por otra vía
            $this->borrarBD = 0;
        }
        if ($this->getUser()->getAttribute('borrarBDfromPte')) {
            $this->borrarBD2 = $this->getUser()->getAttribute('borrarBDfromPte');
        }
        else{ // Para que funcione el Javascript, aunque en este caso da igual puesto que no se va a editar por otra vía
            $this->borrarBD2 = 0;
        }
        $this->forward404Unless($this->factura = Doctrine_Core::getTable('CrmFactura')->find(array($request->getParameter('id'))), sprintf('Object crm_presupuesto does not exist (%s).', $request->getParameter('id')));
        if (null == $this->factura->getDescuento()){
            $this->factura->setDescuento(0);
        }
        $this->cliente = $this->factura->getCrmContacto();
        $this->vehiculo = $this->factura->getCrmVehiculo();
        $this->factura->calcular();
        $this->form = new CrmFacturaForm($this->factura);
    
    // Cargamos el array de conceptos 
   	//$this->conceptos = $this->presupuesto->getCrmPresupuestoConcepto();
   	//$this->presupuesto->calculaTotal();
    
    //$this->concepto = new CrmPresupuestoConcepto();
    //$this->formConcepto = new CrmPresupuestoConceptoForm($this->concepto);
  }
  
  public function executeDelete(sfWebRequest $request)
  {
    $request->checkCSRFProtection();

    $this->forward404Unless($crm_factura = Doctrine_Core::getTable('CrmFactura')->find(array($request->getParameter('id'))), sprintf('Object crm_presupuesto does not exist (%s).', $request->getParameter('id')));
    $crm_factura->delete();
    
    //Borro la vble de sesión que venía de facturar presupuesto
    //Si vengo de facturar un presupuesto y he cancelado debo borrar el signo facturado del presupuesto.
    $id_presupuesto = $this->getUser()->getAttribute('borrarBD');
    //Si vengo de facturar una orden
    $id_parte = $this->getUser()->getAttribute('borrarBDfromPte');
    if ($id_presupuesto){
        //Y decremento el nº de factura
        $campo = "numFactura";
        $q = Doctrine_Query::create()
               ->select('valor')
               ->from('CrmConfiguracion c1')
               ->where('c1.campo = ?',$campo);
        $numero = $q->fetchOne(array(), Doctrine_Core::HYDRATE_SINGLE_SCALAR);
        $q = Doctrine_Query::create()
               ->update('CrmConfiguracion cf')
               ->set('cf.valor','?',$numero-1)
               ->where('cf.campo = ?',$campo);
        //Y la lanzo
        $q->fetchOne(array(), Doctrine_Core::HYDRATE_SINGLE_SCALAR);
        $crm_presupuesto = Doctrine_Core::getTable('CrmPresupuesto')->find($id_presupuesto);
        $crm_presupuesto->is_validated = false;
        $crm_presupuesto->save();
        
        $this->getUser()->getAttributeHolder()->remove('borrarBD');
        $this->getUser()->setFlash('error', sfContext::getInstance()->getI18n()->__('Se ha cancelado la facturación del presupuesto nº'.$id_presupuesto));
        $this->redirect('presupuesto/index');
    }
    else {
        if ($id_parte){
            //Y decremento el nº de factura
            $campo = "numFactura";
            $q = Doctrine_Query::create()
                    ->select('valor')
                    ->from('CrmConfiguracion c1')
                    ->where('c1.campo = ?',$campo);
            $numero = $q->fetchOne(array(), Doctrine_Core::HYDRATE_SINGLE_SCALAR);
            $q = Doctrine_Query::create()
                    ->update('CrmConfiguracion cf')
                    ->set('cf.valor','?',$numero-1)
                    ->where('cf.campo = ?',$campo);
            //Y la lanzo
            $q->fetchOne(array(), Doctrine_Core::HYDRATE_SINGLE_SCALAR);
            $crm_parte = Doctrine_Core::getTable('CrmParte')->find($id_parte);
            $crm_parte->remove_it = false;
            $crm_parte->save();
        
            $this->getUser()->getAttributeHolder()->remove('borrarBDdesdeParte');
            $this->getUser()->setFlash('error', sfContext::getInstance()->getI18n()->__('Se ha cancelado la facturación de la orden de trabajo nº'.$id_parte));
            $this->redirect('parte/index');
        }
        else{
            $this->redirect('factura/index');
        }
    }     
  }
  
  /*
   * Función creada para facturar un presupuesto
   * Automáticamente genera los datos de la factura y los edita
   * Si el usuario guarda la factura el presupuesto se marcará como facturado.
   * No se utiliza, puesto que con los formularios embebidos no podía crear los conceptos
   * si estos no estaban en la base de datos.
   * Queda a modo de histórico
   */
  public function executeFacturarPresupuestoOld(sfWebRequest $request)
  {
     //Veo si ya está presupuestado, en cuyo caso muestro un mensaje
     $this->presupuesto = Doctrine_Core::getTable('CrmPresupuesto')->find(array($request->getParameter('id')));
    //Requisito: Para Facturar un presupuesto, este debe estar aceptado. Elimino requisito!!! 
     //if ($this->presupuesto->remove_it != TRUE){
       //    $this->getUser()->setFlash('error', sfContext::getInstance()->getI18n()->__('ERROR: El presupuesto nº '.$this->presupuesto->getNumero().' no está aceptado'));
         //  $this->redirect('@crm_presupuesto');
     //}
     //else {
         if ($this->presupuesto->is_validated == TRUE) {
                $this->getUser()->setFlash('error', sfContext::getInstance()->getI18n()->__('ERROR: El presupuesto nº '.$this->presupuesto->getNumero().' ya está facturado'));
                $this->redirect('@crm_presupuesto');
          } 
          else {
                //Si no está facturado
                //Creo un nuevo objeto Factura
                $fra = new CrmFactura();
                //Establecemos el numero de factura que le corresponde
                $campo = "numFactura";
                $q = Doctrine_Query::create()
                        ->select('valor')
                        ->from('CrmConfiguracion c1')
                        ->where('c1.campo = ?',$campo);
                $numero = $q->fetchOne(array(), Doctrine_Core::HYDRATE_SINGLE_SCALAR);
                //Y asignamos los valores del presupuesto a los campos de la factura     
                $fra->setNumero($numero);
                $fra->setObservaciones($this->presupuesto->getObservaciones());
                $fra->setTotal($this->presupuesto->getTotal());
                $fra->setClienteId($this->presupuesto->getClienteId());
                $fra->setPersonalId($this->presupuesto->getPersonalId());
                $fra->setEmpresaId($this->presupuesto->getEmpresaId());
                $fra->setVehiculoId($this->presupuesto->getVehiculoId());
                $fra->setTipo($this->presupuesto->getTipo());
                $fra->setImporte($this->presupuesto->getImporte());
                $fra->setDescuento($this->presupuesto->getDescuento());
                $fra->setBase($this->presupuesto->getBase());
                $fra->setIva($this->presupuesto->getIva());
                //Para la fecha asignamos la fecha actual, no la del presupuesto
                $today = date("Y-m-d");
                $fra->setFecha($today);
                
                //Creo una variable para poder marcar más adelante el pto como facturado
                $this->getUser()->setAttribute('presupFacturado',$request->getParameter('id'));
                
                //Y llamo al formulario (como en el método executeEdit) 
                $this->getUser()->setAttribute('accion','editar');
                //Creo esta variable para poder actualizar el nº de fra cuando se guarde
                $this->getUser()->setAttribute('nueva_fra',1);
                 //Borro las vbles de sesion de los otros documentos (no sé si es necesario)
                $this->getUser()->getAttributeHolder()->remove('nuevo_parte');
                $this->getUser()->getAttributeHolder()->remove('nuevo_pto');
         
                // calculo el resto de los campos y llamo al formulario
                $this->factura = $fra;
                if (null == $this->factura->getDescuento()){
                        $this->factura->setDescuento(0);
                }
                $this->cliente = $this->factura->getCrmContacto();
                $this->vehiculo = $this->factura->getCrmVehiculo();
                $this->factura->calcular();
                $this->form = new CrmFacturaForm($this->factura);
                $this->setTemplate('edit');  
           }//if 2
    //}  //if 1
     
  }
  
  public function executeActualizaClienteId(sfWebRequest $request){
     $this->cliente = Doctrine_Core::getTable('CrmContacto')->findOneById($request->getParameter('cliente_id'));
     $this->vehiculo = Doctrine_Core::getTable('CrmVehiculo')->findOneByClienteId($request->getParameter('cliente_id'));
     $this->vehiculos = Doctrine_Core::getTable('CrmVehiculo')->getVehiculoByClienteIdQuery($request->getParameter('cliente_id'))->execute();
     $this->clientes = Doctrine_Core::getTable('CrmContacto')->findAll();
   }   
   
   public function executeActualizaBusquedaClienteId(sfWebRequest $request){
     $this->cliente = Doctrine_Core::getTable('CrmContacto')->findOneById($request->getParameter('cliente_id'));
     $this->vehiculo = Doctrine_Core::getTable('CrmVehiculo')->findOneByClienteId($request->getParameter('cliente_id'));
     $this->vehiculos = Doctrine_Core::getTable('CrmVehiculo')->getVehiculoByClienteIdQuery($request->getParameter('cliente_id'))->execute();
     $this->clientes = Doctrine_Core::getTable('CrmContacto')->findAll();
     $cliente = $this->cliente;
     $vehiculo = $this->vehiculo;
     $clientes = $this->clientes;
     $vehiculos = $this->vehiculos;
  }  
  
  public function executeActualizaVehiculoId(sfWebRequest $request){
     $this->vehiculo = Doctrine_Core::getTable('CrmVehiculo')->findOneById($request->getParameter('vehiculo_id'));
  }   

  public function executeUpdate(sfWebRequest $request)
  {
    $this->forward404Unless($request->isMethod(sfRequest::POST) || $request->isMethod(sfRequest::PUT));
    $this->forward404Unless($crm_factura = Doctrine_Core::getTable('CrmFactura')->find(array($request->getParameter('id'))), sprintf('Object crm_factura does not exist (%s).', $request->getParameter('id')));
    $crm_factura->calcular();
    $this->form = new CrmFacturaForm($crm_factura);
    
    //Borro la vble de sesión que venía de facturar presupuesto
    $this->getUser()->getAttributeHolder()->remove('borrarBD');
   
    $this->processForm($request, $this->form);

    $this->setTemplate('edit');
  }
  
  public function executeAddConcepto(sfWebRequest $request){
  	$this->forward404unless($request->isXmlHttpRequest());
  	$number = intval($request->getParameter("num"));
        
  	$this->form = new CrmFacturaForm();
  	$this->form->addNewFields($number);
  	return $this->renderPartial('addNewConcepto',array('form' => $this->form, 'number' => $number));
  }
  
  /* Una factura no se puede borrar
  public function executeDelete(sfWebRequest $request)
  {
    $request->checkCSRFProtection();

    $this->forward404Unless($crm_factura = Doctrine_Core::getTable('CrmFactura')->find(array($request->getParameter('id'))), sprintf('Object crm_factura does not exist (%s).', $request->getParameter('id')));
    $crm_factura->delete();
    $this->getUser()->setFlash('notice', sfContext::getInstance()->getI18n()->__('The selected item have been deleted successfully.'));
    $this->redirect('factura/index');
  }
  */
  
public function executeBatch(sfWebRequest $request)
  {
    $request->checkCSRFProtection();

	if (!$action = $request->getParameter('batch_action'))
    {
      $this->getUser()->setFlash('error', sfContext::getInstance()->getI18n()->__('You must select an action to execute on the selected items.'));

      $this->redirect('@crm_factura');
    }

    if (!$ids = $request->getParameter('ids'))
    {
	  if ($action == 'batchPrint')  // Le hemos dado a imprimir pero sin seleccionar nada. IMPRIMIR TODO
      {
    		if (!method_exists($this, $method = 'execute'.ucfirst($action)))
    		{
      			throw new InvalidArgumentException(sprintf('You must create a "%s" method for action "%s"', $method, $action));
    		}
    		// execute batch executeBachPrint sin ids
      		$this->$method($request);
      }
      $this->getUser()->setFlash('error',sfContext::getInstance()->getI18n()->__('You must at least select one item.'));

      $this->redirect('@crm_factura');
    }

    if (!method_exists($this, $method = 'execute'.ucfirst($action)))
    {
      throw new InvalidArgumentException(sprintf('You must create a "%s" method for action "%s"', $method, $action));
    }


    $validator = new sfValidatorDoctrineChoice(array('multiple' => true, 'model' => 'CrmFactura'));
    try
    {
      // validate ids
      $ids = $validator->clean($ids);

      // execute batch
      $this->$method($request);
    }
    catch (sfValidatorError $e)
    {
      $this->getUser()->setFlash('error',sfContext::getInstance()->getI18n()->__('A problem occurs when deleting the selected items as some items do not exist anymore.'));
    }

    $this->redirect('@crm_factura');
  }

  public function executeImprimir(sfWebRequest $request)
  {
  	// Cargamos el helper para la fecha
  	sfContext::getInstance()->getConfiguration()->loadHelpers('Date');
  	 
  	// Recogemos los datos de la factura
  	$factura = Doctrine_Core::getTable('CrmFactura')->find(array($request->getParameter('id')));
  	$this->forward404Unless($factura);
  	$cliente = Doctrine_Core::getTable('CrmContacto')->find($factura->getClienteId());
  	$vehiculo = $factura->getCrmVehiculo();
  	$conceptos = $factura->getCrmFacturaConcepto();
  	$conceptosData = $conceptos->getData();
  
        //Tomo los datos de la empresa de la base de datos.
        $id_empresa = $this->getUser()->getAttribute('empresa_id');
        $empresa = Doctrine_Core::getTable('CrmEmpresa')->find(array($id_empresa));
  
  	//Cargamos los datos del pdf
  	$config = sfTCPDFPluginConfigHandler::loadConfig();
  	// pdf object
  	$pdf = new FONDOPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
  	$saltoEncabezado = PDF_HEADER_STRING;
  	$limite = 230;
  	$numpagina = 1;
  	$separ = 1;
  
  	// Definimos los metadatos
  	$pdf->setMetadata();
  
  	// set header and footer fonts
  	$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
  
  	// set default monospaced font
  	$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
  
  	//set margins
  	$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
  	$pdf->SetHeaderMargin(0);
  	$pdf->SetFooterMargin(0);
  
  	// remove default footer
  	$pdf->setPrintFooter(false);
  
  	//set auto page breaks
  	$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
  
  	//set image scale factor
  	$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
  
  	//set some language-dependent strings
  	//$pdf->setLanguageArray($l);
  
  	// ---------------------------------------------------------
  
  	// add a page
  	$pdf->AddPage();
  
  	// get the current page break margin
  	$bMargin = $pdf->getBreakMargin();
  	// get current auto-page-break mode
  	$auto_page_break = $pdf->getAutoPageBreak();
  	// disable auto-page-break
  	$pdf->SetAutoPageBreak(false, 0);
  	// set bacground image
  	$img_file = sfConfig::get('pdf_imagenfondo');
  	$pdf->Image($img_file, 0, 0, 210, 297, '', '', '', false, 300, '', false, false, 0);
  	// restore auto-page-break status
  	$pdf->SetAutoPageBreak($auto_page_break, $bMargin);
  	// set the starting point for the page content
  	$pdf->setPageMark();
  
  	$pdf->escribeDatosEmpresa($empresa);
  	$pdf->escribeLogo($empresa);
  	$pdf->escribeTextoDocumento();
  	$pdf->escribeDocumento('Factura',$factura->getNumero(),$numpagina, format_date($factura->getFecha(), "d"), $cliente, $vehiculo, $factura->getKms());
  
  	$conceptos=$pdf->escribeConceptos($conceptos);
  	while ($conceptos->count()!=0){
  		$pdf->escribeTotales($factura, false);
  		$numpagina = $numpagina+1;
  		// add a page
  		$pdf->AddPage();
  		// get the current page break margin
  		$bMargin = $pdf->getBreakMargin();
  		// get current auto-page-break mode
  		$auto_page_break = $pdf->getAutoPageBreak();
  		// disable auto-page-break
  		$pdf->SetAutoPageBreak(false, 0);
  		// set bacground image
  		$img_file = sfConfig::get('pdf_imagenfondo');
  		$pdf->Image($img_file, 0, 0, 210, 297, '', '', '', false, 300, '', false, false, 0);
  		// restore auto-page-break status
  		$pdf->SetAutoPageBreak($auto_page_break, $bMargin);
  		// set the starting point for the page content
  		$pdf->setPageMark();
  		$pdf->escribeDatosEmpresa($empresa);
  		$pdf->escribeLogo($empresa);
  		$pdf->escribeTextoDocumento();
  		$pdf->escribeDocumento('Factura',$factura->getNumero(),$numpagina, format_date($factura->getFecha(), "d"), $cliente, $vehiculo, $factura->getKms());
  		$conceptos=$pdf->escribeConceptos($conceptos);
  	}
  	$pdf->escribeTotales($factura,true);
  
        //Escribo las observaciones solo en la última página
        $pdf->escribeObservaciones();
        
  	// Close and output PDF document
  	$pdf->Output('Factura '.$factura->getNumero().'.pdf', 'I');
  	 
  	// Stop symfony process
  	throw new sfStopException();
  
  }
  
  protected function imprimeDocumento(FONDOPDF $pdf, CrmFactura $factura)
  {
  	// Cargamos el helper para la fecha
  	sfContext::getInstance()->getConfiguration()->loadHelpers('Date');
  
  	// Recogemos los datos de la factura
  	$cliente = Doctrine_Core::getTable('CrmContacto')->find($factura->getClienteId());
  	$vehiculo = $factura->getCrmVehiculo();
  	$conceptos = $factura->getCrmFacturaConcepto();
  	$conceptosData = $conceptos->getData();
  
        //Tomo los datos de la empresa de la base de datos.
        $id_empresa = $this->getUser()->getAttribute('empresa_id');
        $empresa = Doctrine_Core::getTable('CrmEmpresa')->find(array($id_empresa));
  
  	$saltoEncabezado = PDF_HEADER_STRING;
  	$limite = 230;
  	$numpagina = 1;
  	$separ = 1;
  
  	// Definimos los metadatos
  	$pdf->setMetadata();
  
  	// set header and footer fonts
  	$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
  
  	// set default monospaced font
  	$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
  
  	//set margins
  	$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
  	$pdf->SetHeaderMargin(0);
  	$pdf->SetFooterMargin(0);
  
  	// remove default footer
  	$pdf->setPrintFooter(false);
  
  	//set auto page breaks
  	$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
  
  	//set image scale factor
  	$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
   
  	// add a page
  	$pdf->AddPage();
  
  	// get the current page break margin
  	$bMargin = $pdf->getBreakMargin();
  	// get current auto-page-break mode
  	$auto_page_break = $pdf->getAutoPageBreak();
  	// disable auto-page-break
  	$pdf->SetAutoPageBreak(false, 0);
  	// set bacground image
  	$img_file = sfConfig::get('pdf_imagenfondo');
  	$pdf->Image($img_file, 0, 0, 210, 297, '', '', '', false, 300, '', false, false, 0);
  	// restore auto-page-break status
  	$pdf->SetAutoPageBreak($auto_page_break, $bMargin);
  	// set the starting point for the page content
  	$pdf->setPageMark();
  
  	$pdf->escribeDatosEmpresa($empresa);
  	$pdf->escribeLogo($empresa);
  	$pdf->escribeTextoDocumento();
  	$pdf->escribeDocumento('Factura',$factura->getNumero(),$numpagina, format_date($factura->getFecha(), "d"), $cliente, $vehiculo, $factura->getKms());
  
  	$conceptos=$pdf->escribeConceptos($conceptos);
  	while ($conceptos->count()!=0){
  		$pdf->escribeTotales($factura, false);
  		$numpagina = $numpagina+1;
  		// add a page
  		$pdf->AddPage();
  		// get the current page break margin
  		$bMargin = $pdf->getBreakMargin();
  		// get current auto-page-break mode
  		$auto_page_break = $pdf->getAutoPageBreak();
  		// disable auto-page-break
  		$pdf->SetAutoPageBreak(false, 0);
  		// set bacground image
  		$img_file = sfConfig::get('pdf_imagenfondo');
  		$pdf->Image($img_file, 0, 0, 210, 297, '', '', '', false, 300, '', false, false, 0);
  		// restore auto-page-break status
  		$pdf->SetAutoPageBreak($auto_page_break, $bMargin);
  		// set the starting point for the page content
  		$pdf->setPageMark();
  		$pdf->escribeDatosEmpresa($empresa);
  		$pdf->escribeLogo($empresa);
  		$pdf->escribeTextoDocumento();
  		$pdf->escribeDocumento('Factura',$factura->getNumero(),$numpagina, format_date($factura->getFecha(), "d"), $cliente, $vehiculo, $factura->getKms());
  		$conceptos=$pdf->escribeConceptos($conceptos);
  	}
  	$pdf->escribeTotales($factura,true);
        //Escribo las observaciones solo en la última página
        $pdf->escribeObservaciones();
  }
  
  public function executePagado(sfWebRequest $request)
  {
        // Recogemos los datos de la factura
  	$factura = Doctrine_Core::getTable('CrmFactura')->find(array($request->getParameter('id')));
  	$this->forward404Unless($factura);
        
        $factura->is_validated = true;
        $factura->save();
        
        $this->getUser()->setFlash('notice', sfContext::getInstance()->getI18n()->__('La factura ha sido marcada como pagada.'));
        $this->redirect('@crm_factura');
  }
  
  
  protected function executeBatchPrint(sfWebRequest $request)
  {
  
  	if (!$ids = $request->getParameter('ids')){
  		//imprimir sin ids imprime nada
  		$this->getUser()->setFlash('error', sfContext::getInstance()->getI18n()->__('Debe de selecionar al menos uno para imprimir.'));
    
                /* $records = Doctrine_Query::create()
  		->from('CrmFactura')
  		->execute(); */
  	} else {   // imprime solo los ids selecionados
  		$records = Doctrine_Query::create()
                ->from('CrmFactura')
                        ->whereIn('id', $ids)
                ->execute();

                //Cargamos los datos del pdf
                $config = sfTCPDFPluginConfigHandler::loadConfig();
                // pdf object
                $pdf = new FONDOPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
                foreach ($records as $record){
                    $this->imprimeDocumento($pdf, $record);
                }
                // Close and output PDF document
                $pdf->Output('Lista de Facturas.pdf', 'I');

                        // Stop symfony process
                throw new sfStopException();
  	}
  
  
  
  	$this->redirect('@crm_factura');
  }
  
  protected function executeBatchPagado(sfWebRequest $request)
  {
    $ids = $request->getParameter('ids');

    $records = Doctrine_Query::create()
      ->from('CrmFactura')
      ->whereIn('id', $ids)
      ->execute();

    foreach ($records as $record)
    {
      $record->is_validated = true;
      $record->save();
    }

    $this->getUser()->setFlash('notice', sfContext::getInstance()->getI18n()->__('Las Facturas seleccionadas han sido marcadas como pagadas.'));
    $this->redirect('@crm_factura');
  }
  
  protected function executeBatchDelete(sfWebRequest $request)
  {
    /*$ids = $request->getParameter('ids');

    $records = Doctrine_Query::create()
      ->from('CrmFactura')
      ->whereIn('id', $ids)
      ->execute();

    foreach ($records as $record)
    {
      $record->delete();
    }

    $this->getUser()->setFlash('notice', sfContext::getInstance()->getI18n()->__('The selected items have been deleted successfully.'));
    $this->redirect('@crm_factura');*/
  }

  protected function processForm(sfWebRequest $request, sfForm $form)
  {
    $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));
    
    if ($form->isValid())
    {
      $crm_factura = $form->save();
      
      //Si vengo de un nuevo presupuesto y todo ha sido correcto, tendré un nuevo número
      //en este caso no puedo venir de una edición o de facturar un presupuesto
      if ($this->getUser()->getAttribute('nueva_fra') == 1){
            //Actualizamos el siguiente numero de presupuesto
            $campo = "numFactura";
            // Creo la consulta
            $q = Doctrine_Query::create()
                ->update('CrmConfiguracion cf')
                ->set('cf.valor','?',$crm_factura->getNumero()+1)
                ->where('cf.campo = ?',$campo);
            //Y la lanzo
            $q->fetchOne(array(), Doctrine_Core::HYDRATE_SINGLE_SCALAR);
      }      
      //Si vengo de un presupuesto y se ha creado la factura, lo marco como facturado y aceptado
      if ($this->getUser()->getAttribute('presupFacturado')){
            $this->presupuesto = Doctrine_Core::getTable('CrmPresupuesto')->find(array($this->getUser()->getAttribute('presupFacturado')));
            $this->presupuesto->is_validated = TRUE;
            $this->presupuesto->remove_it = TRUE;
            $this->presupuesto->save();
            //Y elimino la vble de sesión
            $this->getUser()->getAttributeHolder()->remove('presupFacturado');
      }
      
      //Actualizo el valor de kilometros de Vehiculos con los de la factura
      $q = Doctrine_Query::create()
                ->update('CrmVehiculo v')
                ->set('v.kms','?',$form->getValue('kms'))
                ->where('v.id = ?',$form->getValue('vehiculo_id'));
      //Y la lanzo
      $q->fetchOne(array(), Doctrine_Core::HYDRATE_SINGLE_SCALAR);
      
      //$this->redirect('presupuesto/edit?id='.$crm_presupuesto->getId());
      $this->getUser()->setFlash('notice', sfContext::getInstance()->getI18n()->__('La factura ha sido actualizado'));
      $this->redirect('factura/index');
    }
  }

  protected function getFilters()
  {
    return $this->getUser()->getAttribute('factura.filters');
  }

  protected function setFilters(array $filters)
  {
    return $this->getUser()->setAttribute('factura.filters', $filters);
  }

  protected function getPager()
  {
    $campo = "numRegistros";
    $q = Doctrine_Query::create()
    ->select('valor')
    ->from('CrmConfiguracion c1')
    ->where('c1.campo = ?',$campo);
    $numelementos = $q->fetchOne(array(), Doctrine_Core::HYDRATE_SINGLE_SCALAR);
      
    $pager = new sfDoctrinePager('CrmFactura', $numelementos);  
    //$pager = new sfDoctrinePager('CrmFactura', sfConfig::get('app_list_max_facturas'));
    $pager->setQuery($this->buildQuery());
    $pager->setPage($this->getPage());
    $pager->init();

    return $pager;
  }

  protected function setPage($page)
  {
    $this->getUser()->setAttribute('factura.page', $page);
  }

  protected function getPage()
  {
    return $this->getUser()->getAttribute('factura.page', 1);
  }

  protected function buildQuery()
  {
    $tableMethod = 'CrmFactura';
    $filterValues = $this->getFilters();
    $this->valores = $filterValues;
    //create a default query
    $query = Doctrine_Core::getTable('CrmFactura')->createQuery('p');

    if (null === $this->filtro)
    {
      $this->filtro = new CrmFacturaFormFilter($filterValues);
    }

    //if the form have been submited
    if($filterValues){
      //bind the values
      $this->filtro->bind($filterValues);
      //if valid, specialise the request using the form
      if($this->filtro->isValid())
         $query = $this->filtro->getQuery();
    }

    $this->addSortQuery($query);

    $event = $this->dispatcher->filter(new sfEvent($this, 'crm.build_query'), $query);
    $query = $event->getReturnValue();

    return $query;
  }

  protected function addSortQuery($query)
  {
    if (array(null, null) == ($sort = $this->getSort()))
    {
      return;
    }

    if (!in_array(strtolower($sort[1]), array('asc', 'desc')))
    {
      $sort[1] = 'asc';
    }

    $query->addOrderBy($sort[0] . ' ' . $sort[1]);
  }

  protected function getSort()
  {
    if (null !== $sort = $this->getUser()->getAttribute('factura.sort'))
    {
      return $sort;
    }

    $this->setSort(array('id',sfConfig::get('app_sort_default','asc')));

    return $this->getUser()->getAttribute('factura.sort');
  }

  protected function setSort(array $sort)
  {
    if (null !== $sort[0] && null === $sort[1])
    {
      $sort[1] = 'asc';
    }

    $this->getUser()->setAttribute('factura.sort', $sort);
  }

  protected function isValidSortColumn($column)
  {
    return Doctrine_Core::getTable('CrmFactura')->hasColumn($column);
  }
  
  protected function esPrimeraFactura(){
    $campo = "primeraFactura";
    $q = Doctrine_Query::create()
    ->select('valor')
    ->from('CrmConfiguracion c1')
    ->where('c1.campo = ?',$campo);
    $primera = $q->fetchOne(array(), Doctrine_Core::HYDRATE_SINGLE_SCALAR);
    return $primera;
  }  
}